/**
 * 数据处理类，可以根据项目自行配置
 */
import type { AxiosRequestConfig, AxiosResponse } from 'axios';
import type { RequestOptions, Result } from './types';

export interface CreateAxiosOptions extends AxiosRequestConfig {
  authenticationScheme?: string;
  transform?: AxiosTransform;
  requestOptions?: RequestOptions;
}

export abstract class AxiosTransform {
  /**
   * 请求之前处理配置
   * @description 在发起请求之前对配置进行处理
   * @param {AxiosRequestConfig} config 请求配置
   * @param {RequestOptions} options 额外的请求选项
   * @returns {AxiosRequestConfig} 处理后的请求配置
   */
  beforeRequestHook?: (config: AxiosRequestConfig, options: RequestOptions) => AxiosRequestConfig;

  /**
   * 请求成功处理
   * @param {AxiosResponse<Result>} res 响应结果
   * @param {RequestOptions} options 请求选项
   * @returns {any} 处理后的数据
   */
  transformRequestData?: (res: AxiosResponse<Result>, options: RequestOptions) => any;

  /**
   * 请求失败处理
   * @param {Error} e 错误对象
   * @returns {Promise<any>} 处理后的结果
   */
  requestCatch?: (e: Error) => Promise<any>;

  /**
   * 请求之前的拦截器
   * @param {AxiosRequestConfig} config 请求配置
   * @param {CreateAxiosOptions} options Axios 实例的配置选项
   * @returns {AxiosRequestConfig} 处理后的请求配置
   */
  requestInterceptors?: (
    config: AxiosRequestConfig,
    options: CreateAxiosOptions,
  ) => AxiosRequestConfig;

  /**
   * 请求之后的拦截器
   * @param {AxiosResponse<any>} res 响应结果
   * @returns {AxiosResponse<any>} 处理后的响应结果
   */
  responseInterceptors?: (res: AxiosResponse<any>) => AxiosResponse<any>;

  /**
   * 请求之前的拦截器错误处理
   * @param {Error} error 错误对象
   */
  requestInterceptorsCatch?: (error: Error) => void;

  /**
   * 请求之后的拦截器错误处理
   * @param {Error} error 错误对象
   */
  responseInterceptorsCatch?: (error: Error) => void;
}
